home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / cross / dasm202.lha / dasm-2.02 / ftohex.c < prev    next >
C/C++ Source or Header  |  1995-02-20  |  3KB  |  154 lines

  1.  
  2. /*
  3.  *  FTOHEX.C
  4.  *
  5.  *  FTOHEX format infile [outfile]
  6.  *
  7.  *  format: format used when assembling (asm705/asm65)
  8.  *      1,2,3        -generate straight hex file
  9.  *
  10.  *  compilable on an ibm-pc or amiga  _fmode is for Lattice C on the IBM,
  11.  *  is IGNORED by Aztec C on the Amiga.  Note that INT and CHAR are not
  12.  *  used as IBM's lattice C uses 16 bit ints and unsigned chars.
  13.  */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17.  
  18. typedef unsigned char ubyte;
  19. typedef unsigned short uword;
  20.  
  21. #define PERLINE 16
  22.  
  23. void exiterr(char *str);
  24. void convert(int format, FILE *in, FILE *out);
  25. uword getwlh(FILE *in);
  26. void puth(ubyte c, FILE *out);
  27.  
  28. uword _fmode = 0;
  29.  
  30. int
  31. main(int ac, char **av)
  32. {
  33.     int format;
  34.     FILE *infile;
  35.     FILE *outfile;
  36.  
  37.     _fmode = 0x8000;
  38.     if (ac < 3) {
  39.     puts("FTOHEX format infile [outfile]");
  40.     puts("format 1,2, or 3.  3=raw");
  41.     puts("(C)Copyright 1987 by Matthew Dillon, All Rights Reserved");
  42.     exit(1);
  43.     }
  44.     format = atoi(av[1]);
  45.     if (format < 1 || format > 3)
  46.     exiterr("specify infile format 1, 2, or 3");
  47.     infile = fopen(av[2], "r");
  48.     if (infile == NULL)
  49.     exiterr("unable to open input file");
  50.     outfile = (av[3]) ? fopen(av[3], "w") : stdout;
  51.     if (outfile == NULL)
  52.     exiterr("unable to open output file");
  53.     convert(format, infile, outfile);
  54.     fclose(infile);
  55.     fclose(outfile);
  56.  
  57.     return 0;
  58. }
  59.  
  60. void
  61. exiterr(char *str)
  62. {
  63.     fputs(str, stderr);
  64.     fputs("\n", stderr);
  65.     exit(1);
  66. }
  67.  
  68. /*
  69.  *  Formats:
  70.  *
  71.  *  1:      origin (word:lsb,msb) + data
  72.  *  2:      origin (word:lsb,msb) + length (word:lsb,msb) + data    (repeat)
  73.  *  3:      data
  74.  *
  75.  *  Hex output:
  76.  *
  77.  *  :lloooo00(ll bytes hex code)cc      ll=# of bytes
  78.  *              oooo=origin
  79.  *            cc=invert of checksum all codes
  80.  */
  81.  
  82. void
  83. convert(int format, FILE *in, FILE *out)
  84. {
  85.     uword org = 0;
  86.     uword idx;
  87.     long len;
  88.     ubyte buf[256];
  89.  
  90.     if (format < 3)
  91.     org = getwlh(in);
  92.     if (format == 2) {
  93.     len = getwlh(in);
  94.     } else {
  95.     long begin = ftell(in);
  96.     fseek(in, 0, 2);
  97.     len = ftell(in) - begin;
  98.     fseek(in, begin, 0);
  99.     }
  100.     for (;;) {
  101.     while (len > 0) {
  102.         register ubyte chk;
  103.         register int i;
  104.  
  105.         idx = (len > PERLINE) ? PERLINE : len;
  106.         fread(buf, idx, 1, in);
  107.         putc(':', out);
  108.         puth(idx, out);
  109.         puth(org >> 8, out);
  110.         puth(org & 0xFF, out);
  111.         putc('0', out);
  112.         putc('0', out);
  113.         chk = idx + (org >> 8) + (org & 0xFF);
  114.         for (i = 0; i < idx; ++i) {
  115.         chk += buf[i];
  116.         puth(buf[i], out);
  117.         }
  118.         puth((ubyte)-chk, out);
  119.         putc('\r', out);
  120.         putc('\n', out);
  121.         len -= idx;
  122.         org += idx;
  123.     }
  124.     if (format == 2) {
  125.         org = getwlh(in);
  126.         if (feof(in))
  127.         break;
  128.         len = getwlh(in);
  129.     } else {
  130.         break;
  131.     }
  132.     }
  133.     fprintf(out, ":00000001FF\r\n");
  134. }
  135.  
  136. uword
  137. getwlh(FILE *in)
  138. {
  139.     uword result;
  140.  
  141.     result = getc(in);
  142.     result += getc(in) << 8;
  143.     return(result);
  144. }
  145.  
  146. void
  147. puth(ubyte c, FILE *out)
  148. {
  149.     static char dig[] = { "0123456789ABCDEF" };
  150.     putc(dig[c>>4], out);
  151.     putc(dig[c&15], out);
  152. }
  153.  
  154.